import pyglet

window = pyglet.window.Window()	# Er 640, 480 by default

# Ég var fáránlega lengi að láta collision testin virka og þess vegna er forritið mjög ljótt
# og líklega erfitt að skilja af hverju ég geri sumt en ég breytti oft bara hlutum til þess að þau mundu virka
# sama hvort ég sá ástæðuna eða ekki. Þessi geturFardidUpp/Nidur/Haegri/Vinstri er frekar ljótur útaf endurtekningu
# en hann virkar (ólíkt hinum tveimur aðferðunum sem ég byrjaði á) þannig ég nota hann.

class Bill:
	def __init__(self, mynd, xGrid, yGrid, snuningur):
		self.mynd = mynd
		if snuningur == 'n':
			self.x = 80*(xGrid)
		else:
			self.x = 80*(xGrid-1)
		self.y = 80*(yGrid-1)
		self.sprite = pyglet.sprite.Sprite(self.mynd, self.x, self.y)
		self.snuningur = snuningur
		self.valinn = False	# Til að það sé bara hægt að draga einn bíl í einu
		
	def draw(self):
		self.sprite.set_position(self.x, self.y)
		if self.snuningur == 'n':
			self.sprite.rotation = 270	# Snúið um 270 gráður
		self.sprite.draw()
		
	def snapToGrid(self):
		self.x = round(self.x/80)*80
		self.y = round(self.y/80)*80
		
	def breidd(self):
		if self.snuningur == 'h':
			return self.sprite.width
		return self.sprite.height
		
	def haed(self):
		if self.snuningur == 'h':
			return self.sprite.height
		return self.sprite.width
		
	def snertir(self, x, y):
		if self.snuningur == 'h':
			if self.x < x < self.x + self.sprite.width and self.y < y < self.y + self.sprite.height:
				return True
		else:
			if self.x - self.sprite.height < x < self.x  and self.y < y < self.y + self.sprite.width:
				return True
		return False
	
	def geturFaridHaegri(self, uppteknirReitir, dx):
		yStadur = round(self.y/80)
		xStadur = (self.x+dx+self.breidd())//80
		if uppteknirReitir[yStadur][xStadur]:
			return False
		return True
		
	def geturFaridVinstri(self, uppteknirReitir, dx):
		yStadur = round(self.y/80)
		xStadur = (self.x+dx)//80
		if uppteknirReitir[yStadur][xStadur]:
			return False
		return True
		
	def geturFaridUpp(self, uppteknirReitir, dy):
		xStadur = round(self.x/80)-1
		yStadur = (self.y+dy+self.haed())//80
		if uppteknirReitir[yStadur][xStadur]:
			return False
		return True
		
	def geturFaridNidur(self, uppteknirReitir, dy):
		xStadur = round(self.x/80)-1
		yStadur = (self.y+dy)//80
		if uppteknirReitir[yStadur][xStadur]:
			return False
		return True
	
	def move(self, dx, dy, uppteknirReitir):
		if self.snuningur == 'h' and 0 < self.x+dx < 480 - self.sprite.width:
			maFaera = True
			if dx > 0 and not self.geturFaridHaegri(uppteknirReitir, dx):
				maFaera = False
			if dx < 0 and not self.geturFaridVinstri(uppteknirReitir, dx):
				maFaera = False
			if maFaera:
				self.x += dx
		elif self.snuningur == 'n' and 0 < self.y+dy < 480 - self.sprite.width:
			maFaera = True
			if dy > 0 and not self.geturFaridUpp(uppteknirReitir, dy):
				maFaera = False
			if dy < 0 and not self.geturFaridNidur(uppteknirReitir, dy):
				maFaera = False
			if maFaera:
				self.y += dy
	
grid = pyglet.resource.image('myndir/grid.png')
raudurBill = pyglet.resource.image('myndir/raudurBill.png')	# Hægt væri að loada mynd í klasanum en ef sami bíll er notaður tvisvar þá borgar þetta sig því myndinni er loadað einu sinni (held ég)
blarBill = pyglet.resource.image('myndir/blarBill.png')
graennBill = pyglet.resource.image('myndir/graennBill.png')

# Borðið er 6*6, hver reitur er 80 pixlar, 160 pixlar lausir vinstra megin

bilar = []	# Hver bíll verður listi á forminu [mynd, x, y, snuningur]
bilar.append(Bill(raudurBill, 2, 4, 'h'))
bilar.append(Bill(blarBill, 1, 6, 'h'))
bilar.append(Bill(graennBill, 3, 1, 'h'))
bilar.append(Bill(blarBill, 5, 2, 'h'))
bilar.append(Bill(graennBill, 1, 3, 'n'))
bilar.append(Bill(blarBill, 1, 1, 'n'))
bilar.append(Bill(graennBill, 4, 3, 'n'))
bilar.append(Bill(graennBill, 6, 4, 'n'))

def uppteknirReitir(bilaListi):
	reitir = []
	for x in range(0, 6):
		reitir.append([])
		
	for x in range(0, 6):
		for i in range(0, 6):
			reitir[x].append(False)
			for bill in bilaListi:
				if bill.snertir(i*80+40, x*80+40) and not bill.valinn:
					reitir[x][i] = True
					
	return reitir

@window.event
def on_draw():
	window.clear()
	grid.blit(0,0)
	for bill in bilar:
		bill.draw()

@window.event
def on_mouse_release(x, y, button, modifiers):
	for bill in bilar:
		bill.snapToGrid()
		bill.valinn = False
	if bilar[0].snertir(5*80+40, 3*80+40):
		print("Sigur")

@window.event
def on_mouse_press(x, y, button, modifiers):
	for bill in bilar:
		if bill.snertir(x, y):
			bill.valinn = True

@window.event
def on_mouse_drag(x, y, dx, dy, button, modifiers):
	for bill in bilar:
		if bill.valinn:		# and bill.snertir(x, y) gæti verið bætt við til að breyta hegðun þegar dregið er
			bill.move(dx, dy, uppteknirReitir(bilar))

pyglet.app.run()
